package com.bjsxt.shop.head.springmvc.intercepto;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bjsxt.shop.common.util.ConstatFinalUtil;
import com.bjsxt.shop.goods.pojo.AUsersCar;
import com.bjsxt.shop.goods.service.IGoodsService;
import com.bjsxt.shop.users.pojo.AAdmins;
import com.bjsxt.shop.users.pojo.AUsers;
import com.bjsxt.shop.users.service.IUsersShopService;

/**
 * 拦截器
 *登陆后要设置所有的用户操作都先走一遍拦截器，在ssm框架中一般用到的是适配器HandlerInterceptorAdapter
 *1:先判断用户是否已经登陆，如果用户已经登录，那么应该将添加购物车的信息直接储存到数据库中（这里老师并没有考虑）
 *2：如果用户没有登陆，应该先把信息放在cookie中，等用户登录后，把cookie里面的信息全部储存到数据库中
 */
@Component("authInter")
public class AuthInter extends HandlerInterceptorAdapter
{
	@Resource
	private IUsersShopService usersShopService;
	@Resource
	private IGoodsService goodsService;
	/*如果用户添加购物车之前，没有登录，现在开始登陆了，那就开始合并购物车
	 * 1：本来应该跳转到用户中心，这里先不跳转，通过版本号为0，直接让id为1的用户登录
	 * 2：之后将得到的用户储存在session中	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
	{
		ConstatFinalUtil.SYS_LOGGER.info("--preHandle--");
		HttpSession session = request.getSession() ; 
		
		AUsers users = (AUsers) session.getAttribute("users");
		if(users != null)
		{
			return true ; 
		}
		
		/**
		 * 拦截器里面要写的代码如下:
		 * 
		 * 参照shop-web-back中的Auth里面的代码
		 * 
		 * ~用户中心前端用户登陆的流程和管理员的登陆一模一样
		 * 
		 * ~启动用户中心(head);
		 * 
		 * 拦截器里面的代码:
		 * 第一次
		 * ~先从session中取数据
		 * ~取不到,取token,验证token
		 * ~如果token也取不到,客户端跳转到用户中心的前端的页面(要跟上returnURl)
		 * ~用户中心登陆成功,客户端跳转跳转到returnUrl;就带了一个Token
		 * 
		 * 第二次
		 * ~又走拦截器了,(Toekn)
		 *  ~先从session中取数据
		 * ~取不到,取token,验证token,成功
		 * ~将token对应的信息放到session中
		 * 
		 * >=2次
		 * ~直接从session中取数据了
		 */
		if("0".equalsIgnoreCase(ConstatFinalUtil.CONFIG_JSON.getString("version")))
		{
			/* 查询id为1的用户 */
			Map<String, Object> condMap = new HashMap<String, Object>();
			condMap.put("id", "2");
			users = this.usersShopService.findOneUsersService(condMap);
			session.setAttribute("users", users);
			
			/* 在这合并数据 */
			this.updateMerageUsersCar(request,response,users);
			return true ; 
		}
		return false;
	}

	/**
	 * 合并数据
	 * 
	 * ~获取Cookie里面购物车的信息
	 * ~循环购物车,
	 * ~入库,入库的时候要判断是否存在,如果存在,加数量;如果不存在,直接添加吧
	 * ~清空Cookie
	 */
	/*合并cookie的步骤
	 * 1：整体上就是要把cookie的信息储存在JSONArray中
	 * 2：通过request获取到cookie的数组，利用JSON.parse把cookie的信息转化为JSON形式
	 * 3：储存在JSONArray中之后，便可以清除cookie
	 * 		cookie.setValue("");
			cookie.setPath(request.getContextPath());
			cookie.setMaxAge(0);	
	 * 4：开始循环jsonarray，获取里面的信息
	 * 5：通过goodsid和usersid联合主键查询到用户购物车，如果查询出来就让num的值+1，否则就添加购物车的信息*/
	private void updateMerageUsersCar(HttpServletRequest request,HttpServletResponse response,AUsers users)
	{
		/* 
		 * ~获取Cookie里面购物车的信息
		 *  */
		JSONArray goodsArr = new JSONArray() ;  
		Cookie[] cookies = request.getCookies();
		
		/* 取最终要想的Coolie */
		for (int i = 0; i < cookies.length; i++)
		{
			Cookie cookie = cookies[i];
			if("goodsCarList".equalsIgnoreCase(cookie.getName()))
			{
				goodsArr = (JSONArray) JSON.parse(cookie.getValue()); 
				
				/*~清空Cookie*/
				cookie.setValue("");
				cookie.setPath(request.getContextPath());
				cookie.setMaxAge(0);
				response.addCookie(cookie);
			}
		}
		
		Map<String, Object> condMap = new HashMap<String, Object>();
		
		/*~循环购物车,
		 * goodsArr绝对不是null,不会报空指针
		 * */
		for (Iterator iterator = goodsArr.iterator(); iterator.hasNext();)
		{
			JSONObject goodsJSON = (JSONObject) iterator.next();
			
			String gid = goodsJSON.get("id") + "";
			String num = goodsJSON.get("num") + "" ;
			
			/*
			 * ~入库,入库的时候要判断是否存在,如果存在,加数量;如果不存在,直接添加吧
			 * 按照用户id和商品id一块查询
			 * */
			condMap.put("goodsId", gid);
			condMap.put("usersId", users.getId());
			AUsersCar usersCar = this.goodsService.findOneUsersCarService(condMap);
			
			boolean update = true ; 
			/*
			 * 断言
			 * */
			if(usersCar == null)
			{
				usersCar = new AUsersCar() ;
				usersCar.setUsersId(users.getId());
				usersCar.setCreateTime(new Date());
				usersCar.setNum(Integer.valueOf(num));
				
				update = false ; 
			}else
			{
				usersCar.setNum(usersCar.getNum() + Integer.valueOf(num));
			}
			
			usersCar.setGoodsId(Integer.valueOf(gid));
			
			usersCar.setStatus(Byte.valueOf("1"));
			usersCar.setUpdateTime(new Date());
			usersCar.setPubTime(new Date());
			
			/* 啥时候更新,
			 * 啥时候添加 */
			JSONObject resDBJSON = null ; 
			if(update)
			{
				resDBJSON = this.goodsService.updateOneUsersCarService(usersCar);
			}else
			{
				resDBJSON = this.goodsService.saveOneUsersCarService(usersCar);
			}
			ConstatFinalUtil.SYS_LOGGER.info("结果:{}",resDBJSON);
		}
	}
}
